<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
<script>
    //21-04-25-夜  补充 
    //21-08-05-夜  修订
   
    /*
        es6 symble新的原生类型，和number&string一样 
    
    */

//Symbol代表创建后独一无二且不可变的数据类型，主要是为了解决可能出现的全局变量冲突的问题。
        // 1.Symbol 函数前不能使用 new 命令，否则会报错。
        // 2.Symbol 函数可以接受一个字符串作为参数，表示对 Symbol 实例的描述，主要是为了在控制台显示，或者转为字符串时，比较容易区分。
        // 3.Symbol 作为属性名，该属性不会出现在 for...in、for...of 循环中，也不会被 Object.keys()、Object.getOwnPropertyNames()、JSON.stringify() 返回。
        // 4.Object.getOwnPropertySymbols 方法返回一个数组，成员是当前对象的所有用作属性名的 Symbol 值。
        // 5.Symbol.for 接受一个字符串作为参数，然后搜索有没有以该参数作为名称的 Symbol 值。如果有，就返回这个 Symbol 值，否则就新建并返回一个以该字符串为名称的 Symbol 值。
        // 6.Symbol.keyFor 方法返回一个已登记的 Symbol 类型值的 key。  

        // Symbol用于防止属性名冲突而产生的 比如向第三方对象中添加属性时  
        // Symbol的值是唯一的 独一味二的不会重复 
        let hd = Symbol();      //通过构造函数创建 
        let edu = Symbol();
        console.log(hd);        //symbol 
        console.log(hd == deu)  //false 因为symble是唯一的，所以hd&deu无论如何都不会相等 

        //Symbol 不可以添加属性 
        let hd = Symbol(); 
        hd.name = "常东东";
        console.log(hd.name);   //undifined 

        //描述参数.字符串用于描述Symbol 方便再控制台分辨Symbol
        let hd = Symbol("is 东东");
        let edu = Symbol("这里测试一下");
        console.log(hd);        //Symbol(is 东东)
        console.log(edu.toString());          //Symbol(这里测试一下)

        //对象属性 
        //Symbol 是独一无二的 所以可以保证对象属性的唯一 
        //Symbol 声明和访问使用 []（变量）形式操作  不能使用 . 语法因为 .语法是操作字符串属性的。
        //错误写法 会将symbol 当成字符串symbol处理
        let symbol = Symbol("老王");
        let obj = {
            symbol: "hdcms.com"
        };
        console.log(obj);
        //正确写法是以[] 变量形式声明和访问
        let symbol = Symbol("锤子");
        let obj = {
             [symbol]: "houdunren.com"
        };
        console.log(obj[symbol]); //houdunren.com
 

        




    
</script>